我們在Day03有提到過API,可以透過呼叫API去觸發伺服器運作一些功能。
但有時候,專案開發人員自身單純想啟動專案程式運行一些功能,或者使用工作排程去運行專案程式的特定功能。這時候單單只有API功能可能是不足的,所以我們專案也要考慮到透過指令(cmd)參數的變化,去執行不同的功能。因此cmd簡單來說就是我們在專案內做 「指令」,可以在終端機上執行。
如果說API的輸入資料是依據網址上的參數(path、query)或請求上的body,那麼cmd的輸入資料肯定是程式指令前面的環境變數(env)以及指令後面的參數(args)。而環境變數的用法,在昨日的文章範例就使用來載入指定檔案。
以下範例的程式碼可以在這邊下載
同樣地,我採用Go語言做範例,不過任何語言都有差不多的方式可以實作。也歡迎大家使用不同的語言實作並分享
/// 編譯程式: go build -o program .
/// 執行指令: APP=ironman ./program 1 2 3
// cmd・第一式:取所有環境變數
fmt.Println("all environments: ", os.Environ())
// Output: all environments: [APP=ironman GOROOT=/usr/local/go SHELL=/bin/zsh ......忽略]
// cmd・第二式:取指定的環境變數
appInEnv := os.Getenv("APP")
fmt.Println("APP in environments: ", appInEnv)
// Output: APP in environments: ironman
// cmd・第三式:取指令參數
fmt.Println("all args: ", os.Args)
// Output: all args:  [./program 1 2 3]
if len(os.Args) < 2 { // 判斷參數除了執行指令本身,有沒有額外參數
    // 如果沒有額外參數,正常結束並提示指令
    fmt.Println("請輸入其中之一的參數: demo, server")
    os.Exit(0)
}
// 定義每個指令,要執行的動作
switch os.Args[1] {
case "demo":
    fmt.Println("這是一個示範指令")
case "server":
    port := ":" + os.Getenv("PORT")
    log.Println("開始建立伺服器 ", port)
    log.Fatal(http.ListenAndServe(port, nil))
default:
    fmt.Println("請輸入其中之一的參數: demo, server")
    os.Exit(1)
}
$ ./program 
請輸入其中之一的參數: demo, server
$ ./program demo
這是一個示範指令
$ PORT=8000 ./program server
開始建立伺服器  :8000
簡易指令(cli或cmd)主要是透過環境變數(env)、參數(args)的傳入資料去做多樣的變化。而指令的實作除了土炮之外,很多程式語言也都有很多神人做的套件可以直接用來製作cli,例如:Go可用Cobra、Node.js可用commander。
好的指令實作方式,一定要考慮到以下幾點:
以上四點的範例如下:
./gola                   
GoLa指令
        啟動伺服器,提供「狼人殺」、「犯人在跳舞」...等遊戲服務
        亦可執行單一指令,或者執行背景排程功能
Usage:
  gola [command]
Examples:
        環境說明
        需傳入以下環境變數:
        ⚙  APP_ENV : 專案環境
                ✏ default       預設值
                ✏ docker        容器開發
                ✏ local         本機開發
                ✏ prod          正式
        ⚙  APP_SITE : 專案端口
                ✏ default       預設值
        --------------
        指令說明
        ⚙  主要指令
                ✏ server   運行伺服器
                ✏ schedule 運行背景排程
                ✏ run [command name] 執行指定命令
        ⚙  可執行的指令 (command name)
                ✏ demo 範例指令
        ?  舉例: APP_ENV=local APP_SITE=default ./gola server
        ?  舉例: APP_ENV=local APP_SITE=default ./gola schedule
        ?  舉例: APP_ENV=local APP_SITE=default ./gola run demo
Available Commands:
  gorpc       GoRPC服務
  grpc        GRPC服務
  help        Help about any command
  run         執行指令
  schedule    啟動背景排程
  server      啟動伺服器
Flags:
  -h, --help   help for gola
Use "gola [command] --help" for more information about a command.